<?php
/**
 * Modelo CRUD de upload
 * @author Thiago Bezerra e Renato Lenz @ PC4 Team
 */
class PC4_Crud_Upload2 extends PC4_Crud_Abstrato {
	
	protected $caminho;
	protected $uploads;

	/**
	 * 
	 * @param $caminho string
	 * @param $tabela string
	 * @param $uploads array (campo -> {tamMaximo, tipos, caminho})
	 * @param $validacoes array (campo -> validacao)
	 */
	function __construct($caminho, $tabela, $uploads = array(), $validacoes = array()) {
		parent::__construct($tabela, $validacoes);
		$this->CI->load->library('upload');
		
		$this->caminho = $caminho;
		$this->uploads = $uploads;
	}
	
	/**
	 * Executa upload de varios arquivos
	 * 
	 * @param array $umRegistro
	 * @param string $campo
	 * @param array $tipos
	 * @param int $tamMaximo
	 * @param string $caminho
	 * 
	 * @return array com erro ou string com o nome do arquivo ou vazio indicando erro
	 */
	protected function trataVariosUpload($campo, $opcoes) {
		$tipos = (!empty($opcoes['tipos']))? $opcoes['tipos'] : array('gif', 'jpg', 'jpeg', 'png', 'jpe');
		$tamMaximo = (!empty($opcoes['tamMaximo'])) ? $opcoes['tamMaximo'] : 1024;
		$caminho = (!empty($opcoes['caminho'])) ? $opcoes['caminho'] : '';
//d($tipos, 'tipos');
//d($opcoes, $campo);
		//Montando string de tipos aceitos para o upload
		$strTipos = implode("|", $tipos);
		
		if(empty($caminho)){
			$caminho = $this->caminho;
		}
		else {
			$caminho = $this->caminho . '/' . $caminho;
		}
		
		//Montando array de configuracao para o upload
		$config['upload_path']	= $caminho;
		$config['max_size']		= $tamMaximo;
		$config['allowed_types']= $strTipos;
		
		$this->CI->upload->error_msg = array();
		$this->CI->upload->initialize($config);
		$this->CI->load->library('Multi_upload');
    
        $files = $this->CI->multi_upload->go_upload($campo);
        if(!$files) {
			$erro = $this->CI->upload->display_errors('<p>','</p>');
			$this->erros[] = 'Não foi possível fazer o upload do arquivo do campo "' . $campo . '".' . $erro;
        }
        
		if($files){
	        foreach($files as $chave => &$registro){
	        	$registro['titulo'] = $_FILES[$campo]['name'][$chave];
	        }
		}
	        return $files;
	}
	
	/**
	 * 
	 * @param array $umRegistro
	 * @param string $campo
	 * @param array $tipos
	 * @param int $tamMaximo
	 * @param string $caminho
	 * 
	 * @return array com erro ou string com o nome do arquivo ou vazio indicando erro
	 */
	protected function trataUpload($umRegistro, $campo, $opcoes) {
		$tipos = (!empty($opcoes['tipos']))? $opcoes['tipos'] : array('pdf', 'gif', 'jpg', 'jpeg', 'png', 'jpe');
		$tamMaximo = (!empty($opcoes['tamMaximo'])) ? $opcoes['tamMaximo'] : 1024;
		$caminho = (!empty($opcoes['caminho'])) ? $opcoes['caminho'] : '';
//d($opcoes, 'o' . $campo);
//d($umRegistro, 'r');
//exit;
		$nome = $umRegistro[$campo]['name'];
		if(empty($caminho)){
			$caminho = $this->caminho;
		}
		else {
			$caminho = $this->caminho . '/' . $caminho;
		}
		
		if (!empty($nome)) {
			//Montando string de tipos aceitos para o upload
			$strTipos = implode("|", $tipos);
			
			//Criando nomes do arquivo
			$hoje	= date("Ymd-His");
			$id		= uniqid();
			$ext	= end(explode(".", $nome));
			$nome_arquivo	= $hoje . "-" . $id;
			$nome_gravacao	= $nome_arquivo.".".$ext;
			
			//Montando array de configuracao para o upload
			$config['upload_path'] = $caminho;
			$config['max_size'] = $tamMaximo;
			$config['file_name'] = $nome_arquivo;
			$config['allowed_types'] = $strTipos;
			
			//Realizando o upload
			$this->CI->upload->error_msg = array();
			$this->CI->upload->initialize($config);
			$condicao = $this->CI->upload->do_upload($campo);
			$erro = $this->CI->upload->display_errors('<p>','</p>');

			if($condicao){
				return $nome_gravacao;
			}
			else{
				$this->erros[] = 'Não foi possível fazer o upload do arquivo do campo "' . $campo . '".' . $erro;
			}
		}
		return '';
	}
	
	/**
	 * 
	 * @param $umRegistro
	 * @param $campo
	 * @param $coluna = nome da coluna no banco de dados
	 * @param $id
	 * @param $tipos
	 * @param $tamMaximo
	 * @param $caminho
	 */
	protected function trataEditaUpload($umRegistro, $campoUpload, $id, $campo = 'id', $opcoes = array()){
//d($umRegistro, 'teste');
		$caminho = (!empty($opcoes['caminho'])) ? $opcoes['caminho'] : '';
		
		$novo = $this->trataUpload($umRegistro, $campoUpload, $opcoes);
		if (!empty($novo)) {
			// Se nao tiver id, pega todos, ou seja apenas 1 registro... raro acontecer mas acontece
			if (!empty($id)) {
				$r = $this->ve($id, $campo);
			}
			else {
				$r = current($this->lista(1, 1));
			}
			$arquivo = $r->$campoUpload;
			
			if(empty($caminho)){			
				$caminhoArquivo = $this->caminho."\\".$arquivo;
			}
			else {
				$caminho = $this->caminho . '\\' . $caminho;
				$caminhoArquivo = $caminho."\\".$arquivo;
			}
			
			//Deletando imagem anterior
			if (is_file($caminhoArquivo)) {
				unlink($caminhoArquivo);
			}
		}
		return $novo;
	}
	
	function insere(&$umRegistro, $debug = false) {
//d($umRegistro, 'rInsere');
		// trata uploads
		foreach ($this->uploads as $campo => $opcoes) {
			$umRegistro[$campo] = $this->trataUpload($umRegistro, $campo, $opcoes);
		}
		// insere normalmente
		if (!empty($this->erros)) {
			if($debug){
				d($umRegistro, 'Inserindo');
				d($this->erros, 'Erros');
			}
			return $this->erros;
		}
		else {
			return parent::insere($umRegistro, $debug);
		}
	}
	//TODO: Tratar os uploads
	function insereVarios($registros, $nome_id = 'id', $opcoes = array('tipos' => array('gif', 'jpg', 'jpeg', 'png', 'jpe')), $debug = false) {
		if (!empty($this->erros)) {
			return $this->erros;
		}
		else {
			return parent::insereVarios($registros, $nome_id, $debug);
		}
	}

	/**
	 * Edita um registro baseado no id
	 * @param array $umRegistro
	 * @param mixed $valor
	 * @param string $campo o nome alternativo para a chave primaria
	 * @param bool $debug
	 * @return array $erros para cada campo que não passou da validação 
	 */
	function edita($umRegistro, $valor = null, $campo = 'id', $debug = false) {
//d($this->uploads, 'uploads');
//d($umRegistro, 'rEdita');
		// trata uploads
		foreach ($this->uploads as $campoUpload => $opcoes) {
			if(!empty($umRegistro['apaga_' . $campoUpload])){
				$umRegistro[$campoUpload] = "";
				unset($umRegistro['apaga_' . $campoUpload]);
			}
			else{
				if(!empty($umRegistro[$campoUpload]['name'])){
					$umRegistro[$campoUpload] = $this->trataEditaUpload($umRegistro, $campoUpload, $valor, $campo, $opcoes);
				}
				else{
					unset($umRegistro[$campoUpload]); 
				}
			}
		}
//d($umRegistro);
//d($this->uploads);
//d($this->erros);
		// edita normalmente
		if (!empty($this->erros)) {
			return $this->erros;
		}
		else {
			return parent::edita($umRegistro, $valor, $campo, $debug);
		}
	}
	/**
	 * @return the $caminho
	 */
	public function getCaminho() {
		return $this->caminho;
	}

	/**
	 * @param $caminho the $caminho to set
	 */
	public function setCaminho($caminho) {
		$this->caminho = $caminho;
	}


}
?>